/**
 *   ЭЛЕКТРОННЫЙ ЖУРНАЛ «ШКАЛА»: РАБОТА С ЗАПИСЯМИ О ПРИЧИНАХ ПРОПУСКОВ УРОКОВ
 *   И ДОБАВЛЕНИЕ ЗАЯВЛЕНИЙ О ПРИЧИНАХ ПРОПУСКОВ РОДИТЕЛЯМИ
 *   Copyright © 2019, А.М.Гольдин. Modified BSD License
 */
"use strict";

const statuses = {
   new:    ["новая", ''],
   reject: ["отклонена", "style='background:#fabec3'"],
   accept: ["одобрена",  "style='background:#bbc274'"]
};

// Добавление нового заявления от родителей (запрос к API)
const sprAdd = async () => {
   let vid   = dqs("#sprVid").value,
       start = dqs("#sprStart").value,
       fin    = dqs("#sprFin").value;
       
   if (start > fin) {info(1, "Неверные даты!"); return;}

   let apiResp = await apireq("sprAdd", [vid, start, fin]);
   if (apiResp == "success") {
      info(0, "Ваше заявление принято "
            + "и будет рассмотрено классным руководителем");
      sprDocsShow("pupil");
   }
   else info(1, "Ошибка на сервере,<br>заявление не принято");
}

// Удаление записи по её id
const sprDel = async (id) => {
   if (!confirm("Заявление будет удалено. Вы уверены?")) return;
   let apiResp = await apireq("sprDel", [id]);
   if (apiResp != "none") sprDocsShow(dqs("#sprSelPupil").value);
   else info(1, "Ошибка на сервере,<br>запись не удалена");
}

// Редактирование статуса записи по её id
// Без второго аргумента - одобрить, со вторым аргументом - отклонить
const sprEdit = async (id, reject) => {
   let act = reject ? "reject"    : "accept",
        go = reject ? "отклонено" : "одобрено";
   if (!confirm(`Заявление будет ${go}. Вы уверены?`)) return;
   let apiResp = await apireq("sprEdit", [id, act]);
   if (apiResp == "success") {
      info(0, `Заявление отредактировано (${go})`);
      sprDocsShow(dqs("#sprSelPupil").value);
   }
   else info(1, "Ошибка на сервере,<br>запись не изменена");
}

// Формирование содержимого таблицы с записями по одному учащемуся
// (API возвращает массив объектов записей по одному учащемуся)
const sprDocsShow = async pupil => {
   // Преобразование даты вида 2019-09-13 к формату 13.09
   const dConv = d => `${d.substr(8,2)}.${d.substr(5,2)}`;
   
   let innerTable = "<tr><th> </th><th> </th><th> </th>"
                  + "<th>Кем внесена</th><th>Даты</th>"
                  + "<th>Основание</th><th>Статус</th></tr>";
   let apiResp = await apireq("sprGet", [pupil]);
   if (apiResp != "none") {
      let sprList = JSON.parse(apiResp);      
      if (!sprList.length) innerTable +=
         "<tr><td colspan=7 class='bg0'>Записей не найдено</td></tr>";      
      else {
         sprList.sort((x,y) => x.start < y.start); // свежие сверху
         let i = 0;
         for (let spr of sprList) {
            i++;
            let start = dConv(spr.start), fin = dConv(spr.fin);
            let dt = (start == fin) ? start : `${start} – ${fin}`;
            let firstTD =
               `<td title="Одобрить" `
             + `onClick="sprEdit('${spr._id}')">&#10133;</td>`
             + `<td title="Отклонить" `
             + `onClick="sprEdit('${spr._id}', 1)">&#10134;</td>`
             + `<td title="Удалить" `
             + `onClick="sprDel('${spr._id}')">&#10060;</td>`;
            if (
                  dqs("#selRole").value == "pupil" ||
                  dqs("#selRole").value == "parent"
               ) firstTD = `<td class="bg0">${i}</td>`
                         + `<td class="bg0"> </td><td class="bg0"> </td>`;
            
            let vidSpr = spr.vid == "par" ? "родители" : spr.vid,
                osnov  = spr.prim == "med" ? "медсправка" :
                        (spr.prim == "doc" ? "документ" :
                        (spr.prim == "fam" ? "семейные обст." : spr.prim));
            innerTable += `<tr>${firstTD}<td>${vidSpr}</td>`
                        + `<td>${dt}</td><td>${osnov}</td>`
                        + `<td ${statuses[spr.state][1]}>`
                        + `${statuses[spr.state][0]}</td></tr>`;
         }
      }
      dqs("#sprShowDel").innerHTML = innerTable;
   }
   else info(1, "Не могу загрузить записи");
};

// Формирование списка детей в селекте выбора учащегося
const sprPupListShow = async () => {
   let clName = dqs("#sprSelClass").value;
   let apiResp = await apireq("pupilsList", [clName]);
   if (apiResp != "none") {
      let pupilsList = JSON.parse(apiResp);
      let selPupilInner = '';
      for (let pup of pupilsList)
         selPupilInner += `<option value="${pup[1]}">${pup[0]}</option>`;
      dqs("#sprSelPupil").innerHTML = selPupilInner;
      sprDocsShow(pupilsList[0][1]); // показываем записи первого учащегося
   }   
   else info(1, "Не могу загрузить список учащихся");
}

// Формирование контента страницы (regNow, regYst, regYfin определены в ini.js)
createSection("docs", `
   <h2>Уважительные причины <nobr>пропуска уроков</nobr></h2>
   <select id="sprSelClass" onChange="sprPupListShow()"></select>
   <select id="sprSelPupil" onChange="sprDocsShow(this.value)"></select>
   <div id="sprAdd">
      <h3>Подать заявление<br>об уважительной причине
          <nobr>пропуска уроков</nobr></h3>
      <p><b>Уважаемые родители!</b> Указанное вами основание пропуска уроков
      может быть признано уважительным (одобрено) только после представления
      классному руководителю документа на бумажном носителе.
      Ис&shy;клю&shy;че&shy;ни&shy;ем являются семейные обстоятельства, но и
      их необходимо разъяснить классному руководителю по согласованным с ним
      каналам связи (телефонный звонок, email, мессенджеры).</p><p>Под
      «документом организации» понимается, например, письмо из музыкальной или
      спортивной школы, повестка из военкомата и т.&thinsp;п.</p>
      <b>Выберите основание пропуска:</b>
      <select id="sprVid">
         <option value="med">медицинская справка</option>
         <option value="doc">документ организации</option>
         <option value="fam">семейные обстоятельства</option>
      </select><br>
      <b>Пропуск уроков:</b> <nobr>с <input id="sprStart" type="date"
         min="${regYst}" max="${regYfin}" value="${regNow}"></nobr>
      <nobr>по <input id="sprFin" type="date"
         min="${regYst}" max="${regYfin}" value="${regNow}"></nobr>
      <button id="sprSubm" type="button" onClick="sprAdd()"
         >Подать заявление</button>
      <h3>Зарегистрированные записи</h3>
   </div>
   <table id="sprShowDel"></table>
`);

// Динамически формируем содержимое страницы (имя метода = имени пункта меню!)
getContent.docs = async () => {
   
   let sprRole = dqs("#selRole").value;   
   
   // Если он учащийся или родитель, показываем ему только его записи
   if (sprRole == "pupil" || sprRole == "parent") {
      dqs("#sprSelClass").style.display = "none";
      dqs("#sprSelPupil").style.display = "none";

      // Если он учащийся, не показываем ему блок добавления заявления
      if (sprRole == "pupil") dqs("#sprAdd").style.display = "none";

      sprDocsShow("pupil"); // реальный логин подпишется на бэкенде
   }
   
   // Если он классный руководитель, показываем ему его классы
   // и не показываем блок добавления заявления
   else if (sprRole == "tutor") {
      let selClassInner = '';
      for (let cl of uTutorCls) selClassInner += `<option>${cl}</option>`;
      dqs("#sprSelClass").innerHTML = selClassInner;
      sprPupListShow(); // показываем список детей
      dqs("#sprAdd").style.display = "none";
   }
}